用R语言对大气污染物PM10进行统计分析
作者:郭小龙,R语言中文社区专栏作者。知乎专栏:https://www.zhihu.com/people/guo-xiao-long-3-18/posts
1、数据来源
中部某城市2011年1月的大气污染物PM10的逐小时实况监测值,excel格式文档。实际8个监测点,按A、B、C、D、E、F、G、H字母代替。
PM10是指可吸入颗粒物,别名飘尘,通常是指粒径在10微米以下的颗粒物。测量单位为毫克/立方米。
2、分析目的
用R语言进行统计分析,分别计算不同站点的平均值、四分位数、标准差、标准分。通过不同值的差异对比,分析四个指标的实际意义。
3、R语言统计分析计算
3.1 数据预处理
首先,将xls文档转化为CSV格式文档进行读取,直接用函数read.xlsx()读取时,发现该函数只能读属性为xlsx文档,不能读取属性为xls文档。
其次,进行PM10字段的选取,无效数据的剔除,不同监测站点的替换以及数据格式转化等数据预处理工作。代码如下:
###读取Excels数据
library(openxlsx)
library(plyr)
Airdata <- read.csv("G:/统计概率学习实践/第二关实践作业/data/taiyuan201101.csv")
###数据预处理
#data <- Airdata[,c(1:5,9)] ##这种写法也完全正确
data <- Airdata[,-(6:8)]
data$pm <- data$pm * 1000
data1 <- data[data$pm > 0,]
names(data1)[6] <- "pm10"
z <- data1[,1]
data1$zh[z == 1] <- "A"
data1$zh[z == 2] <- "B"
data1$zh[z == 3] <- "C"
data1$zh[z == 4] <- "D"
data1$zh[z == 5] <- "E"
data1$zh[z == 7] <- "F"
data1$zh[z == 8] <- "G"
data1$zh[z == 9] <- "H"
3.2 PM10浓度平均值的计算
平均值的含义不做解释了。
本次分析时使用tapply()和mean()函数对不同站点的均值和所有站点均值都进行了计算,跟后面计算的四分位数、标准差等数值一块单独生成一个新的数据框。图表后面列出。
##(1)计算不同站点pm10浓度的平均值
##按站点分组计算后生成一个新数据框
ss <- tapply(data1$pm10,data1$zh,mean)
zhan <- c("A","B","C","D","E","F","G","H")
date <-c("201101","201101","201101","201101","201101","201101","201101","201101")
avg <- ss
datanew <- data.frame(zhan,date,avg)
Datamean <- round((mean(datanew$avg)),0)
3.3 四分位数的计算
四分位数定义:在统计学中把所有数值由小到大排列并分成四等份够,处于三个分割点(0.25、0.5、0.75)位置的数值。
(1)计算所有站点的PM10浓度数值的四分位数,并绘制箱线图。
##(2)计算不同站点pm10浓度的四分位数
#####计算所有数据的四分位数
Datafen <- quantile(data1$pm10,c(0.25,0.5,0.75))
Datazhong <- median(data1$pm10)
Datamin <- min(data1$pm10)
Datamax <- max(data1$pm10)
boxplot(data1$pm10,main="箱线图",ylab="pm10浓度值")
(2)计算不同站点的四分位数,绘制箱线图对比。
#####计算不同站点数据的四分位数
#对比下不同站点中位数与均值的差异
DatazhongA <- median(data1$pm10[data1$zh == "A"])
DatazhongB <- median(data1$pm10[data1$zh == "B"])
DatazhongC <- median(data1$pm10[data1$zh == "C"])
DatazhongD <- median(data1$pm10[data1$zh == "D"])
DatazhongE <- median(data1$pm10[data1$zh == "E"])
DatazhongF <- median(data1$pm10[data1$zh == "F"])
DatazhongG <- median(data1$pm10[data1$zh == "G"])
DatazhongH <- median(data1$pm10[data1$zh == "H"])
zhong <- c(DatazhongA,DatazhongB,DatazhongC,DatazhongD,DatazhongE,DatazhongF,DatazhongG,DatazhongH)
datanew1 <- cbind(datanew,zhong)
boxplot(pm10 ~ zh,data = data1,main = "不同站点PM10浓度箱线图",
xlab = "Different Location",
ylab = "pm10浓度值")
3.4 标准差的计算
标准差:是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同
用R语言计算PM10的标准差,计算方法如下:
##(3)计算不同站点pm10浓度的标准差
DatasdA <- round((sd(data1$pm10[data1$zh =="A"])),2)
DatasdB <- round((sd(data1$pm10[data1$zh =="B"])),2)
DatasdC <- round((sd(data1$pm10[data1$zh =="C"])),2)
DatasdD <- round((sd(data1$pm10[data1$zh =="D"])),2)
DatasdE <- round((sd(data1$pm10[data1$zh =="E"])),2)
DatasdF <- round((sd(data1$pm10[data1$zh =="F"])),2)
DatasdG <- round((sd(data1$pm10[data1$zh =="G"])),2)
DatasdH <- round((sd(data1$pm10[data1$zh =="H"])),2)
sd <- c(DatasdA,DatasdB,DatasdC,DatasdD,DatasdE,DatasdF,DatasdG,DatasdH)
datanew2 <- cbind(datanew1,sd)
3.5 标准分的计算
标准分,是一种由原始分推导出来的相对地位量数,它是用来说明原始分在所属的那批分数中的相对位置的。
本次分析中对不同站点的平均值用scale()函数计算其标准分。
##(4)计算不同站点pm10浓度的标准分
score <- scale(datanew2$avg)
result <- cbind(datanew2,score)
3.6 结果分析
上图从左到右,分别为站点、日期、平均值、中位数、标准差和标准分。
目前的环境监测中,站点的PM10浓度值是以多次监测的平均值计算,而中位数跟平均值还是有明显差异的。在此不评论方法优劣,只是从描述统计学的角度,用上表中数据说明平均值和中位数的差异。
上表中,标准差(sd)与平均值(avg)呈正相关性。同一时间段内,数据离散程度低,均值也相对较小,说明受外界影响的极端值较少,这在不同站点四分位箱线图中可以看得一目了然。这与实际情况也较为相符,站点附近有道路清扫、工地施工时飘起的扬尘能导致PM10的数据异常,计算时包含这些异常值可导致平均值增大。
从标准分(score)可以看出,A点正值最大,平均值最大;H点负值最大,平均值最小。根据标准分大小可以轻松判断不同站点的质量好坏。
特别说明:本次统计分析重在用R语言对PM10数据的描述统计分析计算方法,其结果和分析只是辅助说明这四个指标的异同之处。
公众号后台回复关键字即可学习
回复 R R语言快速入门免费视频
回复 统计 统计方法及其在R中的实现
回复 用户画像 民生银行客户画像搭建与应用
回复 大数据 大数据系列免费视频教程
回复 可视化 利用R语言做数据可视化
回复 数据挖掘 数据挖掘算法原理解释与应用
回复 机器学习 R&Python机器学习入门